#include "operator.h"
#include "tools.h"
#include <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <assert.h>
#include <string.h>

//书籍批量入库
void put_in_book(void)
{
	char isbn[20];
	size_t num;
	printf("请输入录入的书号:");
	get_str(isbn,sizeof(isbn));
	printf("请输入入库数量：");
	scanf("%d",&num);
	Book_TYPE* data = malloc(sizeof(Book_TYPE)); 

	//馆内有该书的时候，若有预约则，先消除预约数量，在增加在馆数量。
	if(read_book_isbn(isbn,data))
	{
		int order_cnt = file_num(BOOK_ORDER_PATH,isbn);
		if(0 == order_cnt )
		{
			printf("该书没有预约信息，请全部入库\n");
		}
		else if(order_cnt <= num && 0 < order_cnt )
		{
			num -= order_cnt;
			printf("该书有%d条预约记录,请将它们放在预约书架处\n",order_cnt);
			del(BOOK_ORDER_PATH,isbn);
		}
		else if(order_cnt > num)
		{
			printf("该书有%d条预约记录,请将书籍全放在预约书架处\n",order_cnt);
			num = 0;
		}	
		data->purchase_num += num;
		data->now_num += num;
		data->stock_num +=num;
		write_book_isbn(data);

	}
	else
	{
		strcpy(data->isbn,isbn);
		data->purchase_num = num;
		data->now_num = num;
		data->stock_num = num;
		data->natural_damage = 0;
		data->person_damage = 0;
		data->off = false;
		printf("这是新书，请输入详细信息\n请输入书名：");
		get_str(data->name,sizeof(data->name));
		printf("请输入出版社：");
		get_str(data->press,sizeof(data->press));
		printf("请输入作者：");
		get_str(data->author,sizeof(data->author));
		printf("书籍的价格：");
		scanf("%lf",&data->price);

		//获取书籍的类型存储位置。
		char position_tmp[4];
		printf("\n\n书籍的类型\n1.政治\n2.法律\n3,经济\n4.自然科学\n5.计算机\n6.工业与自动化\n7.小说\n8.文学\n");
		position_tmp[0] = get_cmd('1','8');

		printf("\n该书存放的书架：\n");
		position_tmp[1] = get_cmd('A','Z');

   		printf("\n该书存放的层数：\n");
		position_tmp[2] = get_cmd('1','5');

		strcpy(data->position,position_tmp);
		
		printf("\n\n书名： %s\n书号： %s\n作者： %s\n出版社：%s\n位置： %c区 %c书架 %c层\n价格： %.2f元\n\n入库总量： %d本\n馆藏数量： %d本\n在馆数量： %d本\n自然损坏数量： %d本\n人为损坏数量： %d本\n\n\n     ",
		data->name,
		data->isbn,
		data->author,
		data->press,
		data->position[0],
		data->position[1],
		data->position[2],
		data->price,
		data->purchase_num,
		data->now_num,
		data->stock_num,
		data->natural_damage,
		data->person_damage
);
		show_msg("请确认书籍信息是否正确",SHOW_TIME);
		printf("1.确认录入!        2.信息有误重新输入！\n");
		if('2' == get_cmd('1','2'))
			return ;
		
		if(!add_book_all(data->name,data->isbn))
		{
			printf("添加book_name/_all_失败，请联系管理员！");
			anykey_continue();
			return;
		}
		if(!add_record(BOOK_MODE_PATH,category[data->position[0]-'0'],isbn))
		{
			printf("添加book_mode/%s失败，请联系管理员！",category[data->position[0]-'0']);
			anykey_continue();
			return;
		}
	}
	if(write_book_isbn(data))
		show_msg("登记成功！",SHOW_TIME);
	else
		show_msg("登记失败！",SHOW_TIME);
	anykey_continue();
	free(data);
}
  

//显示书籍信息
void show_book_information(Book_TYPE* data)
{
	system("clear");
	puts(" 湖畔图书馆管理系统");
	puts("*****欢迎使用*****");
	printf("\n书名： %s\n书号： %s\n作者： %s\n出版社：%s\n位置： %c区 %c书架 %c层\n价格： %.2f元\n\n入库总量： %u本\n馆藏数量： %u本\n在馆数量： %u本\n自然损坏数量： %u本\n人为损坏数量： %u本\n",
		data->name,
		data->isbn,
		data->author,
		data->press,
		data->position[0],
		data->position[1],
		data->position[2],
		data->price,
		data->purchase_num,
		data->now_num,
		data->stock_num,
		data->natural_damage,
		data->person_damage
);
	printf("------------------\n");
	puts("1、自然报损");
	puts("2、修改价格");
	puts("3、修改馆藏位置");
	puts("4、下架");
	puts("5、退出");
}
	
//查询管理在库书籍信息
void find_book(void)
{
	//查询
	char isbn[20];
	Book_TYPE* data;
	printf("请输入书号");
	get_str(isbn,sizeof(isbn));
	if(!read_book_isbn(isbn,data))
	{
		show_msg("未查询到该书！",SHOW_TIME);
		return;
	}
	for(;;)
    {
		show_book_information(data);
		switch(get_cmd('1','5'))
        {
			//自然报损
			case '1':  {
						printf("请输入报损数量:");
						size_t num;
						scanf("%u",&num);
						if(num <= data->stock_num)
						{
							data->stock_num-=num;
							data->now_num-=num;
							data->natural_damage+=num;
						}
						else
							printf("输入非法！不能修改");
					};break;
			//修改价格
			case '2': {
						printf("请输入新的价格：");
						scanf("%lf",&data->price);
					}break;
			//修改馆藏位置
			case '3':{
						char position_tmp[4];
						strcpy(position_tmp,data->position);
						position_tmp[0] = data->position[0];
						printf("\n该书存放的书架：\n");
						position_tmp[1] = get_cmd('A','Z');
   						printf("\n该书存放的层数：\n");
						position_tmp[2] = get_cmd('1','5');
						strcpy(data->position,position_tmp);
			}break;
			
			case '4':{
			
	if(!del_book_all(isbn))
				{
					printf("添加book_name/_all_失败，请联系管理员！");
					anykey_continue();
					return;
				}
				del(BOOK_ISBN_PATH,isbn);
				
				del_record(BOOK_MODE_PATH,category[data->position[0]-'0'],isbn);

				
				show_msg("下架成功！",SHOW_TIME);
			};return ;//下架
			case '5':write_book_isbn(data); return;    //退出 写入文件
        }
    }

}
//消除预约
void del_book_order(void)
{

	for(;;)
	{
		char isbn[20];
		printf("请输入要消除预约记录书的书号:");
		get_str(isbn,sizeof(isbn));
		if(!del_order(isbn,del_order_information))
		{
			printf("消除book/book_order/%s记录出错！请联系管理员",isbn);
			anykey_continue();
			return;
 		}
		int order_num= file_num(BOOK_ORDER_PATH,isbn);
		if(0 < order_num) 
			printf("该书还有预约");
		else
		{
			Book_TYPE data;
			read_book_isbn(isbn,&data);
			printf("该书没有预约信息了，请放回书架\n%c区 %c书架 %c层\n",data.position[0],data.position[1],data.position[2]);
			read_book_isbn(isbn,&data);
			data.stock_num++;
			write_book_isbn(&data);
			
		}
		printf("按1继续消除预约记录\n按2退出\n");	
		switch(get_cmd('1','2'))
		{
			case '1':break;
			case '2':return;
		}
	}
}

//图书管理界面
void show_book_manager(void)
{
	system("clear");
	puts(" 湖畔图书馆管理系统");
	puts("*****欢迎使用*****");
	puts("1.书籍批量入库");
	puts("2.查询管理在库书籍");
	puts("3.消除预约");
	puts("4.退出");
}

//图书管理
void book_manage(void)
{
	for(;;)
    {
		show_book_manager();
		switch(get_cmd('1','4'))
        {
			case '1': put_in_book(); break;    //书籍批量入库
			case '2': find_book(); break;  	   //查询管理在库书籍
			case '3': del_book_order(); break;  	   //消除预约
			case '4':return ;                //退出
        }
    }
}
//借书
void borrow_book(void)
{
	char id[10];
	for(;;)
	{
		printf("请输入学号：");
		get_str(id,sizeof(id));
		char NAME_path[255];
   		sprintf(NAME_path,"%s%s",STUDENT_PATH,id);
		FILE* rfp = fopen(NAME_path,"r");
    	if(NULL == rfp)
		{
			printf("没找到该学生！\n\n1.退出  2.重新输入\n\n");
			switch(get_cmd('1','2'))
			{
				case '1':return;
				case '2':continue;
			}
		}
		fclose(rfp);
		break;
	}
	for(;;)
	{
		
		if(BORROEW_MAX > file_num(STUDENT_ORDER_PATH,id))
		{
			printf("请输入要借的书号：");
			char isbn[20];
			get_str(isbn,sizeof(isbn));
			write_student_borrow(id,isbn);
		}
		else
		{
			show_msg("您已超过最大借书数量，请先看完手中的书在借！",SHOW_TIME);
			return;
		}		
		printf("\n1.继续借书\n2.结束借书\n");
		switch(get_cmd('1','2'))
		{
			case '1':break;
			case '2':return;
		}
	}
}

//还书
void back_book(char* id)
{
	char NAME_path[255];
    sprintf(NAME_path,"%s%s",STUDENT_BORROW_PATH,id);
 	FILE* rfp = fopen(NAME_path,"r");
    if(NULL == rfp)
	{
		show_msg("该学生没有借书记录!",SHOW_TIME);
        return ;
	}
   	fclose(rfp);
	for(;;)  
	{
		FILE* rfp = fopen(NAME_path,"r");
		if(NULL == rfp)
			return ;
		int num;
		fscanf(rfp,"%d",&num);
		Student_Book data[num];
		for(int i=0;i<num;i++)
		{		
			fscanf(rfp,"%s %s %d %d %d",data[i].name,data[i].isbn,
							&data[i].borrow.year,
							&data[i].borrow.mon,
							&data[i].borrow.day);
		}
		fclose(rfp);
		for(int i=0;i<num;i++)
			printf("%s %s 借书时间：%d：%d：%d \n",data[i].name,data[i].isbn,
							data[i].borrow.year+1900,
							data[i].borrow.mon+1,
							data[i].borrow.day);
		char isbn[20];
		printf("\n请输入还书的书号：");
		get_str(isbn,sizeof(isbn));

		//找到下标
		int cnt = -1;
		for(int i=0;i<num;i++)
			if(0 == strcmp(isbn,data[i].isbn))
				cnt = i;
		if(-1 == cnt)
		{
			printf("输入错误！\n");
		}
		else
		{
			Time t = get_time();
			int sum = -OVER_TIME;
			sum+=(t.year-data[cnt].borrow.year)*12;
			sum+=(t.mon-data[cnt].borrow.mon);
			if(t.day > data[cnt].borrow.day)
				sum++;
			sum = sum<0 ? 0:sum;
			double money;
			Book_TYPE information;
			read_book_isbn(data[cnt].isbn,&information);
			money = information.price*OVER_PRICE*sum;
			if(0 < sum)
				printf("您已逾期%d个月，需缴费%.2lf元\n",sum,money);
			
			bool worn = false;
			printf("\n\n请管理员检查是否破损\n1.破损需要赔付\n2.无破损不需要赔付\n\n");
			if('1' == get_cmd('1','2'))
			{
				worn = true;
				money += information.price*DAMAGED_PRICE;
			}
			if(0 < money)
			{
				printf("您共需赔付%lf元，请支付。\n",money);
				printf("\n1.支付\n2.退出\n");
				if('2' == get_cmd('1','2'))
					return;
				printf("成功支付！")	;		
			}

							
			data[cnt].back = get_time();
            //添加已还记录
			write_student_back(id,&data[cnt]);
	
		    //修改馆藏数据
			//	破了
			if(worn)	
			{
				information.now_num;
				information.person_damage++;
				show_msg("还书成功！",SHOW_TIME);
			}
			else
			{
				if(0 < file_num(BOOK_ORDER_PATH,information.isbn))
					printf("还书成功！\n该书还有预约记录，请放到预约书架\n");
				else
				{
					show_msg("还书成功！",SHOW_TIME);
					information.stock_num ++;
					information.now_num ++;
				}
			}
			
			del_borrow_record(id,&data[cnt]);
			write_book_isbn(&information);
			printf("\n1.继续还书\n2.退出\n");
			if('2' == get_cmd('1','2'))
				return;			
		}
	}
	
}
//还书
void return_book(void)
{
	char id[10];
	for(;;)
	{
		printf("请输入学号：");
		get_str(id,sizeof(id));
		char NAME_path[255];
   		sprintf(NAME_path,"%s%s",STUDENT_PATH,id);
		FILE* rfp = fopen(NAME_path,"r");
    	if(NULL == rfp)
		{
			printf("没找到该学生！\n\n1.退出  2.重新输入\n\n");
			switch(get_cmd('1','2'))
			{
				case '1':return;
				case '2':continue;
			}
		}
		fclose(rfp);
		break;
	}
	if(0 == file_num(STUDENT_BORROW_PATH,id))//该学生没有借书记录
	{
		printf("你没有借过书！\n");
		anykey_continue();
		return;
	}
	back_book(id);
}
//图书借阅归还显示
void show_book_borrow_return(void)
{
	system("clear");
	puts(" 湖畔图书馆管理系统");
	puts("*****欢迎使用*****");
	puts("1.借书");
	puts("2.还书");
	puts("3.返回");
}

//图书借阅归还
void borrow_return(void)    
{
	for(;;)
    {
		show_book_borrow_return();
		switch(get_cmd('1','3'))
        {
			case '1': borrow_book(); break;    //借书
			case '2': return_book(); break;    //还书
			case '3':return ;
        }
    }
}
//主页面
void show_operator(void)
{
	system("clear");
	puts(" 湖畔图书馆管理系统");
	puts("*****欢迎使用*****");
	puts("1、图书管理界面");
	puts("2、图书借阅归还界面");
}




